package cn.lj.service.impl;

import cn.lj.entity.Menu;
import cn.lj.entity.User;
import cn.lj.mapper.MenuMapper;
import cn.lj.service.MenuService;
import cn.lj.vo.MenuDto;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 李津
 * @since 2021-05-19
 */
@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements MenuService {

    /**
     * 获取当前用户的菜单导航
     * @return
     * @param sysUser
     */
    @Override
    public List<MenuDto> getCurrentUserNav(User sysUser) {
        // 获取用户的所有菜单
        List<Long> menuIds = this.baseMapper.getNavMenuIds(sysUser.getId());

        // 把list转成树形结构的数据
        List<Menu> menus = buildTreeMenu(this.listByIds(menuIds));

        // menu转menuDto
        return convert(menus);
    }

    private List<MenuDto> convert(List<Menu> menuTree) {
        List<MenuDto> menuDtos = new ArrayList<>();

        menuTree.forEach(m -> {
            MenuDto dto = new MenuDto();
            dto.setId(m.getId());
            dto.setName(m.getPerms());
            dto.setTitle(m.getName());
            dto.setComponent(m.getComponent());
            dto.setPath(m.getPath());

            if (m.getChildren().size() > 0) {
                // 子节点调用当前方法进行再次转换
                dto.setChildren(convert(m.getChildren()));
            }
            menuDtos.add(dto);
        });

        return menuDtos;
    }

    /**
     * 把list转成树形结构的数据
     * @param menus
     * @return
     */
    private List<Menu> buildTreeMenu(List<Menu> menus) {
        List<Menu> finalMenus = new ArrayList<>();

        for (Menu menu : menus) {
            // 先寻找各自的孩子
            for (Menu m : menus) {
                if (m.getParentId().equals(menu.getId())){
                    menu.getChildren().add(m);
                }
            }
            // 提取出父节点
            if (menu.getParentId()==0L){
                finalMenus.add(menu);
            }
        }
        return finalMenus;
    }

    /**
     * 将菜单信息转成树状结构
     * @return
     */
    @Override
    public List<Menu> tree() {
        // 获取所有菜单信息
        QueryWrapper<Menu> menus = new QueryWrapper<Menu>().orderByAsc("orderNum");
        List<Menu> sysMenus = this.list(menus);

        // 转成树状结构
        return buildTreeMenu(sysMenus);
    }
}
